home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / dsp / 56000tar.z / 56000tar / 56000 / bench / d2-56.asm < prev    next >
Assembly Source File  |  1991-11-26  |  8KB  |  212 lines

  1.      page 132,60,1,1
  2. ;*******************************************
  3. ;Motorola Austin DSP Operation  June 30,1988
  4. ;*******************************************
  5. ;DSP56000/1
  6. ;Port to Memory FFT - 64 point
  7. ;File name: D2-56.asm
  8. ;**************************************************************************
  9. ;    Maximum sample rate:  266.54 us at 20.5 MHZ/ 202.37 us at 27.0 MHz
  10. ;    Memory Size: Prog:  118 words ; Data:  514 words
  11. ;    Number of clock cycles:  5464 (2732 instruction cycles)
  12. ;    Clock Frequency:    20.5MHz/27.0MHz
  13. ;    Instruction cycle time:  97.5ns /  74.1ns
  14. ;**************************************************************************
  15. ;
  16. ; Radix 2 Decimation in Time Fast Fourier Transform Routine
  17. ;
  18. ;    Real input and output data
  19. ;        Real data in X memory
  20. ;        Imaginary data in Y
  21. ;    Normally ordered input data
  22. ;    Normally ordered output data
  23. ;    Coefficient lookup table
  24. ;        -Cosine value in X memory
  25. ;        -Sine value in Y memory
  26. ;
  27. ; Macro Call - fftedn1   points,data,odata,coef,ptr1,ptr2
  28. ;
  29. ;    points     number of points (2-32768, power of 2)
  30. ;    data       start of data buffer
  31. ;    odata      start of output data buffer
  32. ;    coef    start of sine/cosine table
  33. ;    ptr1    location of pointer to block 1 (data collection)
  34. ;    ptr2    location of pointer to block 2 (FFT computation)
  35. ;
  36. ; Alters Data ALU Registers
  37. ;    x1   x0   y1   y0
  38. ;    a2   a1   a0   a
  39. ;    b2   b1   b0   b
  40. ;
  41. ; Alters Address Registers
  42. ;    r0   n0   m0
  43. ;    r1   n1   m1
  44. ;    r2   n2
  45. ;
  46. ;    r4   n4   m4
  47. ;    r5   n5   m5
  48. ;    r6   n6   m6
  49. ;
  50. ; Alters Program Control Registers
  51. ;    pc   sr
  52. ;
  53. ; Uses 6 locations on System Stack
  54. ;
  55. ;**************************************************************************
  56. ;
  57. fftedn1   macro     points,data,odata,coef,ptr1,ptr2
  58. fftedn1   ident     1,2
  59.  
  60. strt move #points,b ;input buffer length
  61. loop move r7,a      ;get input data pointer
  62.      sub  a,b       ;subtract buffer length from current input location
  63.      move x:ptr1,a  ;move input data base addres into a
  64.      cmp  a,b       ;see if equal
  65.      jne  loop      ;if not, go back
  66. ;
  67. ;    when ready, swap pointers of buffer to be loaded and buffer to be processed
  68. ;
  69.      move x:ptr1,a
  70.      move x:ptr2,b
  71.      move b,x:ptr1
  72.      move a,x:ptr2
  73. ;
  74. ;    main fft routine
  75. ;
  76.  
  77.      move ptr2,r0             ;initialize input pointer
  78.      move #points/4,n0        ;initialize input and output pointers offset
  79.      move n0,n4               ;
  80.      move n0,n6               ;initialize coefficient offset
  81.      move #points-1,m0        ;initialize address modifiers
  82.      move m0,m1               ;for modulo addressing
  83.      move m0,m4
  84.      move m0,m5
  85. ;
  86. ; Do first and second Radix 2 FFT passes, combined as 4-point butterflies
  87. ;
  88.      move           x:(r0)+n0,x0
  89.      tfr  x0,a      x:(r0)+n0,y1   
  90.  
  91.      do   n0,_twopass
  92.      tfr  y1,b      x:(r0)+n0,y0
  93.      add  y0,a      x:(r0),x1                     ;ar+cr
  94.      add  x1,b      r0,r4                         ;br+dr
  95.      add  a,b       (r0)+n0                       ;ar'=(ar+cr)+(br+dr)
  96.      subl b,a       b,x:(r0)+n0                   ;br'=(ar+cr)-(br+dr)
  97.      tfr  x0,a      a,x0           y:(r0),b
  98.      sub  y0,a                     y:(r4)+n4,y0   ;ar-cr
  99.      sub  y0,b      x0,x:(r0)                     ;bi-di
  100.      add  a,b                      y:(r0)+n0,x0   ;cr'=(ar-cr)+(bi-di)
  101.      subl b,a       b,x:(r0)                      ;dr'=(ar-cr)-(bi-di)
  102.      tfr  x0,a      a,x0           y:(r4),b
  103.      add  y0,a                     y:(r0)+n0,y0   ;bi+di
  104.      add  y0,b      x0,x:(r0)+n0                  ;ai+ci
  105.      add  b,a                      y:(r0)+,x0     ;ai'=(ai+ci)+(bi+di)
  106.      subl a,b                      a,y:(r4)+n4    ;bi'=(ai+ci)-(bi+di)
  107.      tfr  x0,a                     b,y:(r4)+n4
  108.      sub  y0,a      x1,b                          ;ai-ci
  109.      sub  y1,b      x:(r0)+n0,x0                  ;dr-br
  110.      add  a,b       x:(r0)+n0,y1                  ;ci'=(ai-ci)+(dr-br)
  111.      subl b,a                      b,y:(r4)+n4    ;di'=(ai-ci)-(dr-br)
  112.      tfr  x0,a                     a,y:(r4)+
  113. _twopass
  114. ;
  115. ; Perform all next FFT passes except last pass with triple nested DO loop
  116. ;    
  117.      move #points/8,n1        ;initialize butterflies per group
  118.      move #4,n2               ;initialize groups per pass
  119.      move #-1,m2              ;linear addressing for r2
  120.      move #0,m6               ;initialize C address modifier for
  121.                               ;reverse carry (bit-reversed) addressing
  122.  
  123.      do   #@cvi(@log(points)/@log(2)-2.5),_end_pass    ;example: 7 passes for 1024 pt. FFT
  124.      move ptr2,r0                                      ;initialize A input pointer
  125.      move r0,r1
  126.      move n1,r2
  127.      move r0,r4                                        ;initialize A output pointer
  128.      move (r1)+n1                                      ;initialize B input pointer
  129.      move r1,r5                                        ;initialize B output pointer
  130.      move #coef,r6                                     ;initialize C input pointer
  131.      lua  (r2)+,n0                                     ;initialize pointer offsets
  132.      move n0,n4
  133.      move n0,n5
  134.      move (r2)-                                        ;butterfly loop count
  135.      move           x:(r1),x1      y:(r6),y0           ;lookup -sine and -cosine values
  136.      move           x:(r6)+n6,x0   y:(r0),b            ;update C pointer, preload data
  137.      mac  x1,y0,b                  y:(r1)+,y1
  138.      macr -x0,y1,b                 y:(r0),a
  139.  
  140.      do   n2,_end_grp
  141.      do   r2,_end_bfy
  142.      subl b,a       x:(r0),b       b,y:(r4)            ;Radix 2 DIT butterfly kernel
  143.      mac  -x1,x0,b  x:(r0)+,a      a,y:(r5)
  144.      macr -y1,y0,b  x:(r1),x1
  145.      subl b,a       b,x:(r4)+      y:(r0),b
  146.      mac  x1,y0,b                  y:(r1)+,y1
  147.      macr -x0,y1,b  a,x:(r5)+      y:(r0),a
  148. _end_bfy
  149.      move (r1)+n1
  150.      subl b,a       x:(r0),b       b,y:(r4)
  151.      mac  -x1,x0,b  x:(r0)+n0,a    a,y:(r5)
  152.      macr -y1,y0,b  x:(r1),x1      y:(r6),y0
  153.      subl b,a       b,x:(r4)+n4    y:(r0),b
  154.      mac  x1,y0,b   x:(r6)+n6,x0   y:(r1)+,y1
  155.      macr -x0,y1,b  a,x:(r5)+n5    y:(r0),a
  156. _end_grp
  157.      move n1,b1
  158.      lsr  b    n2,a1     ;divide butterflies per group by two
  159.      lsl  a    b1,n1     ;multiply groups per pass by two
  160.      move a1,n2
  161. _end_pass
  162. ;
  163. ; Do last FFT pass
  164. ;
  165.      move #2,n0          ;initialize pointer offsets
  166.      move n0,n1
  167.      move #points/4,n4   ;output pointer A offset
  168.      move n4,n5          ;output pointer B offset
  169.      move ptr2,r0        ;initialize A input pointer
  170.      move #odata,r4      ;initialize A output pointer
  171.      move r4,r2          ;save A output pointer
  172.      lua  (r0)+,r1       ;initialize B input pointer
  173.      lua  (r2)+n2,r5     ;initialize B output pointer
  174.      move #0,m4          ;bit-reversed addressing for output ptr. A
  175.      move m4,m5          ;bit-reversed addressing for output ptr. B
  176.      move #coef,r6       ;initialize C input pointer
  177.      move (r5)-n5        ;predecrement output pointer
  178.      move           x:(r1),x1      y:(r6),y0
  179.      move           x:(r5),a       y:(r0),b
  180.  
  181.      do   n2,_lastpass
  182.      mac  x1,y0,b   x:(r6)+n6,x0   y:(r1)+n1,y1   ;Radix 2 DIT butterfly kernel
  183.      macr -x0,y1,b  a,x:(r5)+n5    y:(r0),a       ;with one butterfly per group
  184.      subl b,a       x:(r0),b       b,y:(r4)
  185.      mac  -x1,x0,b  x:(r0)+n0,a    a,y:(r5)
  186.      macr -y1,y0,b  x:(r1),x1      y:(r6),y0
  187.      subl b,a       b,x:(r4)+n4    y:(r0),b
  188. _lastpass
  189.      move           a,x:(r5)+n5
  190. ;
  191. ;    when fft is finished, jump back to see if data collection for next fft is completed
  192.      jmp  strt           
  193.      endm
  194. ;
  195. ;
  196. ;
  197. ;    interrupt routine
  198.      org p:$8
  199.      movep     y:$ffff,y:(r7)+          ;data collection upon interrupt
  200. ;
  201. ;    main routine
  202.      org p:$100
  203.      move #16,a
  204.      move a,x:$d0                       ;store pointer to data block 1
  205.      move #80,a
  206.      move a,x:$d1                       ;store pointer to data block 2
  207.      move #127,m7                       ;set r7 for modulo addressing
  208. ;
  209. ;    call fft macro
  210.      fftedn1 64,16,144,210,208,209    
  211.      end
  212.